src/nntpcache.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- bigToStr
- settaskinfo
- task_info_init
- task_info_new
- task_info_free
- sigterm
- sigint
- sigsegv
- sigusr1
- sigusr2
- sighup
- sigalrm
- set_client_sigset
- check_child
- sigchld
- sigpipe
- ncExit
- make_vm_proc
- retire_vm_proc
- load_config
- decomment
- load_groups
- set_cfg_shm
- load_servers
- findScfg
- perform_chroot
- usage
- drop_priv
- drop_idle_servers
- emit_banner
- relay_unknown
- client_cmd
- client_cmd_loop
- client_handler
- createPort
- master_loop
- main
- calloc_dummy
/* $Id: nntpcache.c,v 1.3 1998/08/02 21:01:28 proff Exp $
* $Copyright$
*/
#include "nglobal.h"
#include "network.h"
#include "dbz.h"
#include "mmalloc.h"
#include "acc.h"
#include "article.h"
#include "build_history.h"
#include "date.h"
#include "expire.h"
#include "group.h"
#include "http.h"
#include "ihave.h"
#include "ipc.h"
#include "mmap.h"
#include "newgroups.h"
#include "newnews.h"
#include "next.h"
#include "nocem.h"
#include "post.h"
#include "xover.h"
#include "xpath.h"
#include "nntpcache.h"
extern char *optarg;
EXPORT bool volatile HoldForks = FALSE;
EXPORT bool volatile HoldForksClient = FALSE;
EXPORT bool volatile HoldForksHttp = FALSE;
EXPORT bool volatile HoldForksUpdate = FALSE;
EXPORT bool volatile HoldForksNocem = FALSE;
EXPORT bool SwapWithChild = FALSE;
EXPORT struct nnconf *con = &nnconf;
EXPORT struct strStack *slaveClient;
EXPORT bool f_cleanSlate = TRUE;
EXPORT time_t ClientTimeStarted;
EXPORT struct newsgroup *CurrentGroupNode;
EXPORT char CurrentDir[MAX_PATH];
EXPORT int CurrentGroupArtNum;
EXPORT int CurrentGroupArtRead;
EXPORT bool GroupNextNoCache = FALSE; /* set by post.c to force a one-shot cache miss on the next GROUP command */
EXPORT bool CurrentGroupXoverIsFilt;
EXPORT bool CurrentGroupNocem;
EXPORT struct authent *CurrentGroupAuth;
EXPORT struct authent *ConnectAuth;
EXPORT struct strList *overviewFmt;
EXPORT n_u32 overviewFmt_hash;
EXPORT struct strList *overviewFmtBozo;
EXPORT n_u32 overviewFmtDef_hash;
EXPORT char ClientHost[128 + 1 + MAX_HOST];
EXPORT char ClientHostNormal[MAX_HOST];
EXPORT char ClientHostLocal[MAX_HOST];
EXPORT char ClientHostRFC931[128 + 1 + MAX_HOST];
EXPORT char ClientHostLocalRFC931[128 + 1 + MAX_HOST];
EXPORT char ClientHostAddr[MAX_HOST];
EXPORT char ClientHostAddrRFC931[128 + 1 + MAX_HOST];
EXPORT char *RemoteHosts[] =
{
ClientHost, ClientHostNormal, ClientHostLocal, ClientHostRFC931, ClientHostLocalRFC931,
ClientHostAddr, ClientHostAddrRFC931, NULL
};
EXPORT char Host[MAX_HOST];
EXPORT bool ModeReader = FALSE; /* ModeReader sent */
EXPORT struct server_cfg *ServerList;
EXPORT struct group_cfg *GroupList;
EXPORT struct server_cfg *CurrentGroupScfg;
EXPORT struct server_cfg *CurrentIDScfg;
EXPORT enum auth_state AuthState = none;
EXPORT char authUser[MAX_USERNAME] = "";
EXPORT bool MakeHistory = FALSE;
EXPORT void *Mbase;
EXPORT bool mmapAnon = FALSE;
static int NNTPportFD = -1;
static int HTTPportFD = -1;
static char PidFile[MAX_PATH] = "";
EXPORT int Master_fd = -1;
EXPORT fd_set r_set; /* master client fd list */
static int volatile high_fd; /* highest fd in r_set */
static int ncUID;
static int ncGID;
static struct sigaction myaction;
static struct task_info dummy_task; /* this is for oneshots */
EXPORT struct task_info *Task = &dummy_task;
EXPORT struct task_info **TaskList;
static int task_max = FD_HIGH+40;
EXPORT struct command *Command;
EXPORT struct cache_stats *CS;
EXPORT struct command commands[] =
{
{"ARTICLE", c_article, "[<msgid> | artno]"},
{"AUTHINFO", c_authinfo, "USER username|PASS password"},
{"BODY", c_body, "[<msgid> | artno]"},
{"DATE", c_date, ""},
{"GROUP", c_group, "newsgroup"},
{"HEAD", c_head, "[<msgid> | artno]"},
{"HELP", c_help, ""},
{"IHAVE", c_ihave, "<msgid>"},
{"LAST", c_last, ""},
{"LIST", c_list, "[ACTIVE | ACTIVE.TIMES | NEWSGROUPS | SUBSCRIPTIONS | OVERVIEW.FMT] [pattern]"},
{"LISTGROUP", c_listgroup, "[newsgroup]"},
{"MODE", c_mode, "[READER | QUERY]"},
{"NEWGROUPS", c_newgroups, "yymmdd hhmmss [GMT] [distributions]"},
{"NEWNEWS", c_newnews, "newsgroups yymmdd hhmmss [GMT] [distributions]"},
{"NEXT", c_next, ""},
{"NOOP", c_noop, ""},
{"POST", c_post, ""},
{"QUIT", c_quit, ""},
{"SLAVE", c_slave, ""},
{"STAT", c_stat, "[<msgid> | artno}"},
{"XGTITLE", c_xgtitle, "[pattern]"},
{"XHDR", c_xhdr, "header [<msgid> | range]"},
{"XOVER", c_xover, "[<msgid> | range]"},
{"XPATH", c_xpath, "[<msgid | artno]"},
{NULL, c_none}
};
EXPORT char *task_desc[] = /* keep in-sync with enum task_state! */
{
"none",
"master",
"client",
"update",
"expire",
"nocem",
"oneshot",
"http",
NULL /* nc_last */
};
/* bit length resiliant binary to decimal converter */
EXPORT char *bigToStr(big_t big)
/* [<][>][^][v][top][bottom][index][help] */
{
int n;
bool neg;
char *p;
#define RING_NUM 64 /* > max number of bigToStr's ever used as concurrent function arguments */
static char *ring[RING_NUM];
static int ring_idx;
char buf[128];
buf[sizeof(buf)-1] = '\0';
n=sizeof(buf)-2;
if (big<0)
{
big *=-1;
neg = TRUE;
}
else
neg = FALSE;
do
{
buf[n] = big%10 + '0';
big/=10;
} while (--n > 0 && big >=1);
if (neg)
buf[n--] = neg;
if ((p=ring[ring_idx]))
free(p);
p = ring[ring_idx] = Sstrdup(&buf[n+1]);
if (++ring_idx >= RING_NUM)
ring_idx = 0;
return p;
}
EXPORT void settaskinfo (char *fmt, ...)
/* [<][>][^][v][top][bottom][index][help] */
{
va_list ap;
char buf[MAX_LINE];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
setproctitle("%s", buf);
strncpy(Task->ti_status_line, buf, sizeof(Task->ti_status_line)-1);
Task->ti_status_line[sizeof(Task->ti_status_line)-1] = '\0';
va_end(ap);
}
static struct task_info **task_info_init ()
/* [<][>][^][v][top][bottom][index][help] */
{
return (TaskList = XMcalloc(sizeof(struct task_info *), task_max));
}
/*
* name MUST be in the text segment or permanetly in the shared data segment.
*/
static struct task_info *task_info_new (enum task_state state, char *name)
/* [<][>][^][v][top][bottom][index][help] */
{
int n;
struct task_info *t;
for (n=0; n<task_max; n++)
if (!TaskList[n])
goto found;
loge (("task_info_new() no more tasks (max = %d)", task_max));
return NULL;
found:
t = XMcalloc(sizeof *t, 1);
t->ti_started = time(NULL);
t->ti_state = state;
t->ti_pid = getpid();
t->ti_name = name;
t->ti_idx = n;
TaskList[n] = t;
Stats->task_stats[state].invocations++;
if (Stats->task_high<n)
Stats->task_high = n;
if (state == nc_client)
Stats->clientsActive++;
return t;
}
static void task_info_free (int n)
/* [<][>][^][v][top][bottom][index][help] */
{
struct task_info *p = TaskList[n];
TaskList[n] = NULL;
if (p)
{
if (p->ti_state == nc_client)
Stats->clientsActive--;
XMfree(p);
}
if (Stats->task_high<n)
{
for (n=Stats->task_high;n>=0 && !TaskList[n]; n--) {}
Stats->task_high=n;
}
}
static RETSIGTYPE sigterm (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
signal (SIGTERM, sigterm);
if (Task->ti_state == nc_master)
{
errno = 0;
logw (("caught SIGTERM: syncing database, syncing disks, exiting"));
}
retire_vm_proc (0);
}
static RETSIGTYPE sigint (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
static struct nnconf *nn_orig, nn_new;
signal (SIGINT, sigint);
if (nn_orig)
{
log(("Caught SIGINT - logging set normal"));
con = nn_orig;
nn_orig = NULL;
} else
{
nn_orig = con;
nn_new = *con;
con = &nn_new;
con->logFromClient = TRUE;
con->logToClient = TRUE;
con->logFromServer = TRUE;
con->logToServer = TRUE;
con->logDebug = TRUE;
con->logInfo = TRUE;
con->logWarnings = TRUE;
con->logErrors = TRUE;
con->logListMerge = TRUE;
con->logListMergeCorrelation = TRUE;
con->logInn = TRUE;
log(("Caught SIGINT - full debug logging set"));
}
}
static RETSIGTYPE sigsegv (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
signal (SIGSEGV, SIG_DFL);
loge (("SIGSEGV!"));
Exit (1);
}
static RETSIGTYPE sigusr1 (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
signal (SIGUSR1, SIG_IGN);
updateDaemon (TRUE);
}
static RETSIGTYPE sigusr2 (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
signal (SIGUSR2, SIG_IGN);
expire (TRUE);
}
static int sig_hup = FALSE;
static RETSIGTYPE sighup (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
sig_hup = TRUE;
signal (SIGHUP, sighup);
}
static RETSIGTYPE sigalrm (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
emitf ("%d Timeout after %s, closing connection.\r\n", NNTP_TEMPERR_VAL, nnitod(con->idleTimeout));
log (("timeout after %s", nnitod(con->idleTimeout)));
loginn (("%s timeout", ClientHostNormal));
retire_vm_proc (0);
}
static void set_client_sigset ()
/* [<][>][^][v][top][bottom][index][help] */
{
sigemptyset(&myaction.sa_mask);
sigaddset(&myaction.sa_mask, SIGALRM);
sigaddset(&myaction.sa_mask, SIGTERM);
sigaddset(&myaction.sa_mask, SIGPIPE);
myaction.sa_flags = 0;
myaction.sa_handler = sigalrm;
sigaction(SIGALRM, &myaction, NULL);
}
static void check_child ()
/* [<][>][^][v][top][bottom][index][help] */
{
int n;
#ifdef HAVE_WAIT3
int pid = wait3 (NULL, WNOHANG, NULL);
#else
#ifdef HAVE_WAITPID
int pid = waitpid ((pid_t) - 1, NULL, WNOHANG);
#else
#error no wait3 or waitpid for this system
#endif
#endif
if (pid<1)
return;
for (n=0; n<=Stats->task_high; n++)
if (TaskList[n] && TaskList[n]->ti_pid == pid)
goto found;
loge (("check_child() returned unknow pid (%d)", pid));
return;
found:
task_info_free(n);
if (pid == UpdateDaemonPid)
{
UpdateDaemonPid = 0;
f_cleanSlate = FALSE;
signal (SIGUSR1, sigusr1);
} else if (pid == ExpireDaemonPid)
{
ExpireDaemonPid = 0;
signal (SIGUSR2, sigusr2);
} else if (pid == NocemDaemonPid)
{
NocemDaemonPid = 0;
}
statsUpdateMaster();
}
static RETSIGTYPE sigchld (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
check_child ();
signal (SIGCHLD, sigchld);
}
static RETSIGTYPE sigpipe (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
signal (SIGPIPE, SIG_IGN); /* syslog can cause a SIGPIPE ! */
logd (("client disconnected unexpectedly"));
retire_vm_proc (0);
}
EXPORT void ncExit (int code)
/* [<][>][^][v][top][bottom][index][help] */
{
sigset_t set;
struct sigaction action;
/* ignore anyone interrupting us */
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
action.sa_handler = SIG_IGN;
sigaction(SIGALRM, &action, NULL);
sigaction(SIGTERM, &action, NULL);
sigaction(SIGPIPE, &action, NULL);
if (Task->ti_state == nc_master)
{
chdir(con->cacheDir);
if (!mmapAnon)
{
int fd;
struct mmap_base mb;
bzero(&mb, sizeof mb);
mb.mmap_base = Mbase;
fd = open(con->mmapBaseFile, O_WRONLY|O_TRUNC|O_CREAT, 0664);
if (fd<0 || write(fd, &mb, sizeof mb)!=sizeof mb)
{
loge (("couldn't write '%s'", con->mmapBaseFile));
unlink (con->mmapBaseFile);
}
close (fd);
}
dbzsync ();
dbmclose ();
if (Stats)
saveStats (con->statsFile);
unlink (PidFile);
sync ();
} else
{
if (Task->ti_state == nc_client)
{
struct tms buffer;
n_u32 u, s;
if (CurrentGroupArtRead && CurrentGroupScfg && CurrentGroupScfg->group)
{
loginn (("%s group %s %d", ClientHostNormal,
CurrentGroupScfg->group, CurrentGroupArtRead));
}
loginn (("%s exit articles %d groups %d", ClientHostNormal,
ArtRead, GroupsEntered));
if (PostsReceived>0 || PostsRejected>0)
loginn (("%s posts received %d rejected %d", ClientHostNormal, PostsReceived, PostsRejected));
times(&buffer);
u = buffer.tms_utime;
s = buffer.tms_stime;
loginn (("%s times user %.2f system %.2f elapsed %d.00",
ClientHostNormal,
(double) u/ CLK_TCK,
(double) s/ CLK_TCK,
time(NULL) - ClientTimeStarted));
}
}
if (Master_fd >= 0)
{
close (Master_fd);
}
#ifdef MMALLOC
if (Mbase)
mmalloc_detach (Mbase);
#endif
/* restore default SIGALRM behavior (ie, crash us out) */
/* sigemptyset(&action.sa_mask); already done above */
/* sigaddset(&action.sa_mask, SIGALRM); can't remember why I did this in this 1st place */
/* action.sa_flags = 0; already done above */
action.sa_handler = SIG_DFL;
sigaction(SIGALRM, &action, NULL);
/* unblock, since we might be in a SIGALRM handler right now! */
sigemptyset(&set);
sigaddset(&set, SIGALRM);
sigprocmask (SIG_UNBLOCK, &set, NULL);
alarm(60);
flush (); /* better finish this in 60 seconds, toots. */
if (code == 0)
{
log (("clean shutdown"));
closelog ();
exit (code);
}
log (("clean shutdown with error %d. dumping core for debug analysis", code));
chdir(con->cacheDir);
abort ();
}
/*
* if client is <0, then we presume we are not a regular client, but
* an inernal daemon
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
*/
EXPORT int